package com.hymjweb.demo.framework.util;

import java.math.BigDecimal;
import java.text.DecimalFormat;

/**
 * 用于处理double数值的加减乘除
 * <br>
 * 计算double类型的数时有时候会多出0.000000001，会有不确定个数的0，在计算时将其转为BigDecimal就不会出错。 
 * @author Administrator
 */
public class DoubleUtil {
    /**   
     * 对double数据进行取精度.   
     * @param value  double数据.   
     * @param scale  精度位数(保留的小数位数).   
     * @param roundingMode  精度取值方式.   
     * @return 精度计算后的数据.   
     */
    public static double round(double value, int scale, int roundingMode) {
        BigDecimal bd = new BigDecimal(Double.toString(value));
        bd = bd.setScale(scale, roundingMode);
        double d = bd.doubleValue();
        bd = null;
        return d;
    }

    /**
     * 默认四舍五入保留2位小数
     * @param value
     * @return
     */
    public static double round2(double value) {
        return round(value, 2, BigDecimal.ROUND_HALF_UP);
    }

    /**
     * 判断一个数字是否是整数
     * @param d 
     * @return 例如1.00返回true,1.01返回false
     */
    public static boolean isZs(double d) {
        String s = String.valueOf(d);
        if (s.indexOf(".") >= 0) {
            String temp = s.substring(s.lastIndexOf(".") + 1, s.length());
            return Integer.parseInt(temp) == 0;
        } else
            return true;
    }

    /**  
    * double 相加  
    * @param d1  
    * @param d2  
    * @return  
    */
    public static double sum(double d1, double d2) {
        return sum(d1, d2, 2);
    }

    /**  
    * double 相加  
    * @param d1  
    * @param d2  
    * @param scale四舍五入 小数点位数  
    * @return  
    */
    public static double sum(double d1, double d2, int scale) {
        BigDecimal bd1 = new BigDecimal(Double.toString(d1));
        BigDecimal bd2 = new BigDecimal(Double.toString(d2));
        return bd1.add(bd2).setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    /**  
     * double 相减 ,默认保留2位小数
     * @param d1  
     * @param d2  
     * @return  
     */
    public static double sub(double d1, double d2) {
        return sub(d1, d2, 2);
    }

    /**  
     * double 相减  
     * @param d1  
     * @param d2  
     * @param scale四舍五入 小数点位数  
     * @return  
     */
    public static double sub(double d1, double d2, int scale) {
        BigDecimal bd1 = new BigDecimal(Double.toString(d1));
        BigDecimal bd2 = new BigDecimal(Double.toString(d2));
        return bd1.subtract(bd2).setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    /**  
     * double 乘法  , 默认保留2位
     * @param d1  
     * @param d2  
     * @return  
     */
    public static double mul(double d1, double d2) {
        return mul(d1, d2, 2);
    }

    /**  
     * double 乘法  
     * @param d1  
     * @param d2  
     * @param scale四舍五入 小数点位数  
     * @return  
     */
    public static double mul(double d1, double d2, int scale) {
        BigDecimal bd1 = new BigDecimal(Double.toString(d1));
        BigDecimal bd2 = new BigDecimal(Double.toString(d2));
        return bd1.multiply(bd2).setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    /**  
     * double 除法  
     * @param d1  
     * @param d2  
     * @return 
     */
    public static double div(double d1, double d2) {
        return div(d1, d2, 2);
    }

    /**  
     * double 除法  
     * @param d1  
     * @param d2  
     * @param scale四舍五入 小数点位数  
     * @return 
     */
    public static double div(double d1, double d2, int scale) {
        // 当然在此之前，你要判断分母是否为0，
        // 为0你可以根据实际需求做相应的处理
        BigDecimal bd1 = new BigDecimal(Double.toString(d1));
        BigDecimal bd2 = new BigDecimal(Double.toString(d2));
        return bd1.divide(bd2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    /**
     * 格式化数值以String返回
     * @param d
     * @param cont 希望保留小数的位数
     * @return 例如传入(20,2)返回20.00
     */
    public static String formatDouble(double d, int cont) {
        String fmt = "#.";
        for (int i = 0; i < cont; i++) {
            fmt += "0";
        }
        DecimalFormat df = new DecimalFormat(fmt);// "#.00"
        return df.format(d);
    }

    /**
     * 格式化数值以String返回
     * @param d
     * @param cont 希望保留小数的位数
     * @return 例如传入(20,2)返回20.00
     */
    public static String formatDouble(String doubleStr, int cont) {
        return formatDouble(Double.parseDouble(doubleStr), cont);
    }

    public static void main(String[] args) {
        System.out.println(formatDouble(20, 2));
        System.out.println(round2(0.145));
    }

    public static int double2int(double d) {
        BigDecimal b = new BigDecimal(d);
        b = b.setScale(0, BigDecimal.ROUND_UP);
        return b.intValue();
    }
}
